package com.health.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang.StringUtils;

public class DateUtils {

    /** 标准日期格式 */
    public final static String STANDARD    = "yyyy-MM-dd HH:mm:ss";
    /** 简写日期格式 */
    public final static String COMPACT     = "yyMMdd HH:mm:ss";
    /** 非标准日期格式,下划线间隔 */
    public final static String FILENAME    = "yyMMdd_HHmmss";
    /** 简写年月日格式 */
    public final static String SIMPLE      = "yyMMdd";
    /** 标准年月日格式 */
    public final static String DATE        = "yyyy-MM-dd";
    /** 标准年月日加简写的时分日期格式 */
    public final static String QUERY_STR   = "yyyy-MM-ddHHmm";

    /** 年 */
    public final static char   YEAR_TYPE   = 'y';

    /** 月 */
    public final static char   MONTH_TYPE  = 'M';

    /** 日 */
    public final static char   DAY_TYPE    = 'd';

    /** 时 */
    public final static char   HOUR_TYPE   = 'H';

    /** 分 */
    public final static char   MINUTE_TYPE = 'm';

    /** 秒 */
    public final static char   SECOND_TYPE = 's';

    /** 开始时间 */
    public static final String START_TIME  = " 00:00:00";

    /** 结束时间 */
    public static final String END_TIME    = " 23:59:59";

    /**
     * 格式化为标准日期格式(yyyy-MM-dd HH:mm:ss)的日期
     * 
     * @param strDate 字符串日期
     * @return 标准日期
     */
    public static Date getStandardStringDate(String strDate) {
        return getStringDate(strDate, STANDARD);
    }

    /**
     * 格式化为自定义的日期格式
     * 
     * @param strDate 字符串日期
     * @param strType 自定义的日期格式
     * @return 自定义的日期
     */
    public static Date getStringDate(String strDate, String strType) {
        Date date = null;

        SimpleDateFormat objSDF = new SimpleDateFormat(strType);
        try {
            date = objSDF.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return date;
    }

    /**
     * 获得时间戳
     * 
     * @return
     */
    public static String getDateString(GregorianCalendar objGC, String strType) {
        if (objGC == null)
            return "";
        Date objDate = objGC.getTime();
        return getDateString(objDate, strType);
    }

    public static String getStandardDate(GregorianCalendar objGC) {
        return getDateString(objGC, STANDARD);
    }

    public static String getFileNameDate(GregorianCalendar objGC) {
        return getDateString(objGC, FILENAME);
    }

    public static String getCompactDate(GregorianCalendar objGC) {
        return getDateString(objGC, COMPACT);
    }

    public static String getDateString(Date objDate, String strType) {
        if (objDate == null)
            return "";
        SimpleDateFormat objSDF = new SimpleDateFormat(strType);
        return objSDF.format(objDate);
    }

    public static String getStandardDate(Date objDate) {
        return getDateString(objDate, STANDARD);
    }

    public static String getCompactDate(Date objDate) {
        return getDateString(objDate, COMPACT);
    }

    public static String getFileNameDate(Date objDate) {
        return getDateString(objDate, FILENAME);
    }

    public static String getSysdateString(String strType) {
        Date objDate = new Date();
        return getDateString(objDate, strType);
    }

    public static String getStandardSysdate() {
        Date objDate = new Date();
        return getDateString(objDate, STANDARD);
    }

    /**
     * 简单的日期类型(YYMMDD)
     * 
     * @return
     */
    public static String getSimpleSysdate() {
        Date objDate = new Date();
        return getDateString(objDate, SIMPLE);
    }

    /**
     * 格式化日期 ,精确到天
     * 
     * @param strDate
     * @return
     */
    public static String getStringStandardDate(String strDate) {
        return getDateString(strDate, DATE);
    }

    public static String getCompactSysdate() {
        Date objDate = new Date();
        return getDateString(objDate, COMPACT);
    }

    public static String getFileNameSysdate() {
        Date objDate = new Date();
        return getDateString(objDate, FILENAME);
    }

    public static Date getStandardDate(String strDate) {
        return getStringDate(strDate, STANDARD);
    }

    /**
     * 
     * @param strDate 2010-01-01 12:30:50.0
     * @return
     */
    public static String getStandardDateForDB(String strDate) {
        if (StringUtils.isBlank(strDate)) {
            return null;
        }
        Date objDate = getStandardDate(strDate);
        return getStandardDate(objDate);
    }

    /**
     * 
     * @param strDate 2010-01-01 12:30:50.0
     * @return
     */
    public static String getDateString(String strDate, String strType) {
        if (StringUtils.isBlank(strDate)) {
            return null;
        }
        Date objDate = getStandardDate(strDate);
        return getDateString(objDate, strType);
    }

    /**
     * 获取标准开始日期
     * 
     * @param strBeginDate
     * @return
     */
    public static String getStandardBeginDate(String strBeginDate) {
        strBeginDate = strBeginDate.substring(0, 10) + START_TIME;
        return strBeginDate;
    }

    /**
     * 获取标准结束日期
     * 
     * @param strEndDate
     * @return
     */
    public static String getStandardEndDate(String strEndDate) {
        strEndDate = strEndDate.substring(0, 10) + END_TIME;
        return strEndDate;
    }

    /**
     * 获取标准日期字符串
     * 
     * @param strDate
     * @return
     */
    public static String getStandardDateString(String strDate) {

        SimpleDateFormat objFormat = new SimpleDateFormat(STANDARD);

        Date objDate = null;

        for (int i = 0; i < 2; i++) {
            try {
                objDate = objFormat.parse(strDate);

                objFormat.applyPattern(STANDARD);

            } catch (ParseException e) {

                objFormat.applyPattern(DATE);
            }
        }

        if (null != objDate) {

            return objFormat.format(objDate);
        }

        return null;
    }

    /**
     * 获取指定天数的日期字符串
     * 
     * @param strDay
     * @return
     */
    public static String getConfirmDayDateString(Integer day) {
        Calendar objCal = new GregorianCalendar();
        objCal.set(Calendar.DATE, day);
        return getStandardDate(objCal.getTime());
    }

    /**
     * 获取指定月的日期字符串
     * 
     * @param strDay
     * @return
     */
    public static String getConfirmMonthDayDateString(Integer day) {
        Calendar objCal = Calendar.getInstance();
        Date date = new Date();
        objCal.setTime(date);
        objCal.set(Calendar.MONTH, objCal.get(Calendar.MONTH) - 1);
        if (day != 31) {
            objCal.set(Calendar.DAY_OF_MONTH, day);
        } else {
            objCal.set(Calendar.DAY_OF_MONTH, objCal.getActualMaximum(Calendar.DAY_OF_MONTH));
        }
        return getStandardDate(objCal.getTime());
    }

    /**
     * 获取当月月份字符串
     * 
     * @param strDay
     * @return
     */
    @SuppressWarnings("deprecation")
    public static String getMonthDayDateString(String strEndDate) {

        Date objDate = getStringDate(strEndDate, STANDARD);

        return String.valueOf(objDate.getMonth());

    }

    /**
     * 将指定日期，替换成指定几号的终点时分（23：59：59）
     * 
     * @param strDay
     * @return
     */
    public static String getEndPointByDateString(String strDate, String strDay) {
        if (StringUtils.isBlank(strDate) || strDay.length() > 2) {
            return null;
        }

        if (strDay.length() == 1) {
            strDay = "0" + strDay;
        }

        String strEndDate = strDate.substring(0, 8) + strDay;

        return getStandardEndDate(strEndDate);

    }

    /**
     * <code>
     * 获取当前时间之前amount的一个时间点，最多精确到秒，传入错误的类型抛出IllegalArgumentException异常<br>
     * X代表的字符分别是：<br>
     * YEAR_TYPE - 年<br>
     * MONTH_TYPE - 月<br>
     * DAY_TYPE - 天<br>
     * HOUR_TYPE - 小时<br>
     * MINUTE_TYPE - 分<br>
     * SECOND_TYPE - 秒<br>
     * <code>
     * 
     * @param strDate 开始时间
     * @param amount 增量时间
     * @param type 变更类型
     * @return
     */
    public static Date getDateBefore(String strDate, int amount, char type) {
        return getDateAfter(strDate, -amount, type);
    }

    /**
     * <code>
     * 获取当前时间之前amount的一个时间点，最多精确到秒，传入错误的类型抛出IllegalArgumentException异常<br>
     * X代表的字符分别是：<br>
     * YEAR_TYPE - 年<br>
     * MONTH_TYPE - 月<br>
     * DAY_TYPE - 天<br>
     * HOUR_TYPE - 小时<br>
     * MINUTE_TYPE - 分<br>
     * SECOND_TYPE - 秒<br>
     * <code>
     * 
     * @param date 开始时间
     * @param amount 增量时间
     * @param type 变更类型
     * @return
     */
    public static Date getDateBefore(Date date, int amount, char type) {
        return getDateAfter(date, -amount, type);
    }

    /**
     * <code>
     * 获取当前时间之后amount的一个时间点，最多精确到秒，传入错误的类型抛出IllegalArgumentException异常<br>
     * X代表的字符分别是：<br>
     * YEAR_TYPE - 年<br>
     * MONTH_TYPE - 月<br>
     * DAY_TYPE - 天<br>
     * HOUR_TYPE - 小时<br>
     * MINUTE_TYPE - 分<br>
     * SECOND_TYPE - 秒<br>
     * <code>
     * 
     * @param strDate 开始时间
     * @param amount 增量时间
     * @param type 变更类型
     * @return
     */
    public static Date getDateAfter(String strDate, int amount, char type) {
        return getDateAfter(getStandardDate(strDate), amount, type);
    }

    /**
     * <code>
     * 获取当前时间之后amount的一个时间点，最多精确到秒，传入错误的类型抛出IllegalArgumentException异常<br>
     * X代表的字符分别是：<br>
     * YEAR_TYPE - 年<br>
     * MONTH_TYPE - 月<br>
     * DAY_TYPE - 天<br>
     * HOUR_TYPE - 小时<br>
     * MINUTE_TYPE - 分<br>
     * SECOND_TYPE - 秒<br>
     * <code>
     * 
     * @param date 开始时间
     * @param amount 增量时间
     * @param type 变更类型
     * @return
     */
    public static Date getDateAfter(Date date, int amount, char type) {

        switch (type) {
        case YEAR_TYPE:
            return org.apache.commons.lang.time.DateUtils.addYears(date, amount);
        case MONTH_TYPE:
            return org.apache.commons.lang.time.DateUtils.addMonths(date, amount);
        case DAY_TYPE:
            return org.apache.commons.lang.time.DateUtils.addDays(date, amount);
        case HOUR_TYPE:
            return org.apache.commons.lang.time.DateUtils.addHours(date, amount);
        case MINUTE_TYPE:
            return org.apache.commons.lang.time.DateUtils.addMinutes(date, amount);
        case SECOND_TYPE:
            return org.apache.commons.lang.time.DateUtils.addSeconds(date, amount);
        }
        throw new IllegalArgumentException("type can not be " + type);

    }

    /**
     * 取两个时间差(秒)
     * 
     * @param strD1 String
     * @param strD2 String
     * @return int
     */
    public static int getTimeDiff(String strD1, String strD2) {
        SimpleDateFormat objFM = new SimpleDateFormat(DATE);

        Date D1 = null;
        Date D2 = null;
        try {
            D1 = objFM.parse(strD1);
            D2 = objFM.parse(strD2);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }

        return (int) ((D1.getTime() - D2.getTime()) / 10000);
    }
}
